package com.probox.order.api.domain;

import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.probox.common.core.annotation.Excel;
import com.probox.common.core.enums.*;
import com.probox.common.core.utils.StringUtils;
import com.probox.common.core.utils.money.MoneyUtils;
import com.probox.common.core.utils.money.PriceFormatUtil;
import com.probox.customer.api.domain.CustomerAddressVo;
import com.probox.customer.api.domain.CustomerInvoiceVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * 订单子对象 order_info
 *
 * @author usoft
 * @date 2021-05-27
 */
@Data
@ApiModel(description="订单子对象")
public class OrderInfoVo implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 订单ID
     */
    @ApiModelProperty(value = "订单ID")
    private Long orderUid;
    /** 平台ID */
    @Excel(name = "平台ID")
    @ApiModelProperty(value = "平台ID(平台ID)")
    private Long platformUid;

    /** 供应商ID */
    @Excel(name = "供应商ID")
    @ApiModelProperty(value = "供应商ID(供应商ID)")
    private Long supplierUid;

    /** 供应商名称 */
    @Excel(name = "供应商名称")
    @ApiModelProperty(value = "供应商名称(供应商名称)")
    private String supplierName;

    /** 订单类型 good商品/gift赠品/lottery奖品 */
    @Excel(name = "订单类型 good商品/gift赠品/lottery奖品")
    @ApiModelProperty(value = "订单类型 good商品/gift赠品/lottery奖品(订单类型 good商品/gift赠品/lottery奖品)")
    private String orderType;

    /** 商家订单号 */
    @Excel(name = "商家订单号")
    @ApiModelProperty(value = "商家订单号(商家订单号)")
    private String orderNo;

    /** 支付订单号 */
    @Excel(name = "支付订单号")
    @ApiModelProperty(value = "支付订单号(支付订单号)")
    private String parentOrderNo;

    /** 客户ID */
    @Excel(name = "客户ID")
    @ApiModelProperty(value = "客户ID(客户ID)")
    private Long customerUid;

    /** 客户名称 */
    @Excel(name = "客户名称")
    @ApiModelProperty(value = "客户名称(客户名称)")
    private String customerName;

    /** 手机号码 */
    @Excel(name = "手机号码")
    @ApiModelProperty(value = "手机号码(手机号码)")
    private String phone;

    /** 订单状态 1:有效 0:用户未支付取消 -1:过期未支付无效 -2:用户已支付取消 */
    @Excel(name = "订单状态 1:有效 0:用户未支付取消 -1:过期未支付无效 -2:用户已支付取消")
    @ApiModelProperty(value = "订单状态 1:有效 0:用户未支付取消 -1:过期未支付无效 -2:用户已支付取消")
    private String orderStatus;

    /** 支付状态 0 未支付/1已支付 */
    @Excel(name = "支付状态 0 未支付/1已支付")
    @ApiModelProperty(value = "支付状态 0 未支付/1已支付")
    private String payStatus;

    /** 支付方式 wechat(微信)/balance(余额)/alipay(支付宝)/netbank(网银) */
    @Excel(name = "支付方式 wechat(微信)/balance(余额)/alipay(支付宝)/netbank(网银)")
    @ApiModelProperty(value = "支付方式 wechat(微信)/balance(余额)/alipay(支付宝)/netbank(网银)")
    private String payMethod;

    /** 订单来源(wechat小程序/H5/Web/Android/IOS) */
    @Excel(name = "订单来源(wechat小程序/H5/Web/Android/IOS)")
    @ApiModelProperty(value = "订单来源(wechat小程序/H5/Web/Android/IOS) ")
    private String platSource;

    /** 商品金额，不含运费 */
    @Excel(name = "商品金额，不含运费")
    @ApiModelProperty(value = "商品金额，不含运费(商品金额，不含运费)")
    private Long orderAmount;

    /** 支付金额(已经减去代金券、减去余额、减去折扣金额) */
    @Excel(name = "支付金额(已经减去代金券、减去余额、减去折扣金额)")
    @ApiModelProperty(value = "支付金额(已经减去代金券、减去余额、减去折扣金额) ")
    private Long payAmount;

    /** 运费 */
    @Excel(name = "运费")
    @ApiModelProperty(value = "运费(运费)")
    private Long freightAmount;

    /** 折扣 1 代表百分之一折扣 */
    @Excel(name = "折扣 1 代表百分之一折扣")
    @ApiModelProperty(value = "折扣 1 代表百分之一折扣(折扣 1 代表百分之一折扣)")
    private Long discountRate;

    /** 折扣金额 */
    @Excel(name = "折扣金额")
    @ApiModelProperty(value = "折扣金额(折扣金额)")
    private Long discountAmount;

    /** 使用代金券支付(废弃，使用父订单的代金券字段) */
    @Excel(name = "使用代金券支付(废弃，使用父订单的代金券字段)")
    @ApiModelProperty(value = "使用代金券支付(废弃，使用父订单的代金券字段) ")
    private Long useCouponUid;

    /** 使用代金券金额 */
    @Excel(name = "使用代金券金额")
    @ApiModelProperty(value = "使用代金券金额(使用代金券金额)")
    private Long useCouponAmount;

    /** 余额支付 */
    @Excel(name = "余额支付")
    @ApiModelProperty(value = "余额支付(余额支付)")
    private Long payByBalance;

    /** 积分抵扣 */
    @Excel(name = "积分抵扣")
    @ApiModelProperty(value = "积分抵扣(积分抵扣)")
    private Long payByScore;

    /** 红包支付 */
    @Excel(name = "红包支付")
    @ApiModelProperty(value = "红包支付(红包支付)")
    private Long payByRedBag;

    public String getPayByRedBagStr(){
        return MoneyUtils.changeF2Y(payByRedBag);
    }

    /** 货币单位 */
    @Excel(name = "货币单位")
    @ApiModelProperty(value = "货币单位(货币单位)")
    private String currencyUnit;

    /** 支付时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "支付时间" , width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "支付时间(支付时间)")
    private Date payTime;

    /** 下单时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "下单时间" , width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "下单时间(下单时间)")
    private Date createTime;

    /** 订单取消时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "订单取消时间" , width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "订单取消时间(订单取消时间)")
    private Date cancelTime;

    /** 买家留言 */
    @Excel(name = "买家留言")
    @ApiModelProperty(value = "买家留言(买家留言)")
    private String buyMes;

    /** 未支付订单过期时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "未支付订单过期时间" , width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "未支付订单过期时间( )")
    private Date expireDate;

    /** 备注 */
    @Excel(name = "备注")
    @ApiModelProperty(value = "备注(备注)")
    private String remark;

    /** ip地址 */
    @Excel(name = "ip地址")
    @ApiModelProperty(value = "ip地址(ip地址)")
    private String ip;

    /** 开票信息，为空不需要开票 */
    @Excel(name = "开票信息，为空不需要开票")
    @ApiModelProperty(value = "开票信息，为空不需要开票 ")
    private Long invoiceUid;

    /** 开票状态 0未开票1已开票 */
    @Excel(name = "开票状态 0未开票1已开票")
    @ApiModelProperty(value = "开票状态 0未开票1已开票 ")
    private String invoiceStatus;

    /** 配送方式 express快递、ziti自提、logistics物流 */
    @Excel(name = "配送方式 express快递、ziti自提、logistics物流")
    @ApiModelProperty(value = "配送方式 express快递、ziti自提、logistics物流 ")
    private String deliverMethod;

    /** 收货地址ID */
    @Excel(name = "收货地址ID")
    @ApiModelProperty(value = "收货地址ID(收货地址ID)")
    private Long addressUid;

    /** 发货时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "发货时间" , width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "发货时间(发货时间)")
    private Date sendTime;

    /** 发货状态 -1取消发货0 未发货/1已发货/2已收货 */
    @Excel(name = "发货状态 -1取消发货0 未发货/1已发货/2已收货")
    @ApiModelProperty(value = "发货状态 -1取消发货0 未发货/1已发货/2已收货 ")
    private String sendStatus;

    /** 包裹状态 0待揽收/1运输中/2已妥投 */
    @Excel(name = "包裹状态 0待揽收/1运输中/2已妥投")
    @ApiModelProperty(value = "包裹状态 0待揽收/1运输中/2已妥投 ")
    private String orderPackStatus;

    /** 签收时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "签收时间" , width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "签收时间(签收时间)")
    private Date signTime;

    /** 收货时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "收货时间" , width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "收货时间(收货时间)")
    private Date receiveTime;

    /** 自动收货时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "自动收货时间" , width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "自动收货时间(自动收货时间)")
    private Date autoReceiveTime;

    /** 评价状态  0待评价 1已评价 */
    @Excel(name = "评价状态  0待评价 1已评价")
    @ApiModelProperty(value = "评价状态  0待评价 1已评价 ")
    private String commentStatus;

    /** 评价时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "评价时间" , width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "评价时间(评价时间)")
    private Date commentTime;

    /** 修改人 */
    @Excel(name = "修改人")
    @ApiModelProperty(value = "修改人(修改人)")
    private Long updateUser;

    /** 修改人账号名称 */
    @Excel(name = "修改人账号名称")
    @ApiModelProperty(value = "修改人账号名称(修改人账号名称)")
    private String updateUserName;

    /** 修改时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "修改时间" , width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "修改时间(修改时间)")
    private Date updateTime;

    @ApiModelProperty(value = "活动参与ID")
    private Long joinUid;

    /**
     * 是否需要分账 (Y-是，需要分账;N-否，不分账)
     */
    @ApiModelProperty(value = "是否需要分账 (Y-是，需要分账;N-否，不分账)")
    private String profitSharing;

    /**
     * 分账状态(0未发起分账/1已发起分账/2已解冻分润)
     */
    @ApiModelProperty(value = "分账状态(0未发起分账/1已发起分账/2已解冻分润)")
    private String isShared;

    /**
     * 显示晒单按钮
     * @return
     */
    @ApiModelProperty(value = "显示晒单按钮(1显示0不显示)")
    private String isBuyShow;

    /**
     * 订单明细
     * @return
     */
    @ApiModelProperty(value = "订单明细")
    private List<OrderItemVo> itemList;

    /**
     * 用户发票抬头
     */
    @ApiModelProperty(value = "用户发票抬头")
    private CustomerInvoiceVo customerInvoiceVo;

    /**
     * 开票信息
     * @return
     */
    @ApiModelProperty(value = "开票信息")
    private OrderInvoiceVo invoice;

    /**
     * 发货信息
     * @return
     */
    @ApiModelProperty(value = "发货信息")
    private List<OrderShipDeliverVo> deliverList;

    /**
     * 售后信息
     */
//    private List<OrderPostSaleVo> postSaleList;

    /**
     * 投诉信息
     * @return
     */
    @ApiModelProperty(value = "投诉信息")
    private List<OrderComplaintVo> complaintList;

    /**
     * 订单地址信息
     * @return
     */
    @ApiModelProperty(value = "订单地址信息")
    private CustomerAddressVo customerAddressVo;

    /**
     * 订单时间流程节点
     * @return
     */
    @ApiModelProperty(value = "订单时间流程节点(后端)")
    private List<OrderTimeVo> timeVoList;

    /**
     * 支付倒计时
     * @return
     */
    @ApiModelProperty(value = "支付倒计时")
    public Long getExpireTimes(){
        if(ObjectUtil.isNotEmpty(expireDate) && expireDate.getTime() > System.currentTimeMillis())
            return expireDate.getTime() - System.currentTimeMillis();
        return null;
    }

    //显示支付按钮
    @ApiModelProperty(value = "显示支付按钮(1显示0不显示)")
    public String getShowPayment(){
        if (PayStatusEnum.unpaid.getKey().equals(payStatus)){
            return "1";
        }
        return "0";
    }

    @ApiModelProperty(value = "显示开票按钮(1显示0不显示)")
    private String showInvoice;

    //显示查看物流按钮
    @ApiModelProperty(value = "显示查看物流按钮(1显示0不显示)")
    public String getShowLogistics(){
        if (DeliverMethodEnum.express.getKey().equals(deliverMethod)) {
            if (SendStatusEnum.ship.getKey().equals(sendStatus)
                    || SendStatusEnum.receive.getKey().equals(sendStatus)) {
                return "1";
            }
        }
        return "0";
    }

    @ApiModelProperty(value = "隐藏取消按钮")
    private Boolean showCancelFlag;
    //显示取消按钮
    @ApiModelProperty(value = "显示取消按钮(1显示0不显示)")
    public String getShowCancel(){
        if (PayStatusEnum.unpaid.getKey().equals(payStatus)){
            return "1";
        }else{
            return "0";
        }
    }


    /**
     * 显示收货按钮
     * @return
     */
    @ApiModelProperty(value = "显示收货按钮(1显示0不显示)")
    public String getShowReceive(){
        if (SendStatusEnum.ship.getKey().equals(sendStatus)){
            return "1";
        }
        return "0";
    }

    /**
     * 显示评价按钮
     * @return
     */
    @ApiModelProperty(value = "显示评价按钮(1显示0不显示)")
    public String getShowComment(){
        /*
        if (SendStatusEnum.receive.getKey().equals(sendStatus)
                && CommentStatusEnum.unComment.getKey().equals(commentStatus)){
            return "1";
        }*/
        return "0";
    }

    /**
     * 显示延迟收货按钮
     * @return
     */
    @ApiModelProperty(value = "显示延迟收货按钮(1显示0不显示)")
    public String getShowDelay(){
        /*
        if (SendStatusEnum.ship.getKey().equals(sendStatus)){
            return "1";
        }*/
        return "0";
    }

    /**
     * 显示修改收货地址按钮
     * @return
     */
    @ApiModelProperty(value = "显示修改收货地址按钮")
    public String getShowAddress(){
        /*
        if(PayStatusEnum.unpaid.getKey().equals(payStatus) || SendStatusEnum.unShip.getKey().equals(sendStatus)){
            return "1";
        }*/
        return "0";
    }

    /**
     * 显示申请退款按钮
     * @return
     */
    @ApiModelProperty(value = "显示申请退款按钮")
    public String getShowRefund(){
        /*
        if(PayStatusEnum.paid.getKey().equals(payStatus) && SendStatusEnum.unShip.getKey().equals(sendStatus)){
            return "1";
        }*/
        return "0";
    }

    @ApiModelProperty(value = "订单整体状态(unpay待支付/unsend待发货/unreceive待收货/uncomment待评价/completed已完成)")
    public String getStatus(){
        String rst = OrderQueryStatusEnum.completed.getKey();
        if (PayStatusEnum.unpaid.getKey().equals(payStatus)){
            rst = OrderQueryStatusEnum.unpay.getKey();
        }else if(SendStatusEnum.unShip.getKey().equals(sendStatus)){
            rst = OrderQueryStatusEnum.unsend.getKey();
        }else if(SendStatusEnum.ship.getKey().equals(sendStatus)){
            rst = OrderQueryStatusEnum.unreceive.getKey();
        }else if(CommentStatusEnum.unComment.getKey().equals(commentStatus)){
            rst = OrderQueryStatusEnum.uncomment.getKey();
        }
        return rst;
    }

    //订单整体状态
    @ApiModelProperty(value = "订单整体状态描述")
    public String getStatusName(){
        String rst = OrderQueryStatusEnum.completed.getValue();
        if (PayStatusEnum.unpaid.getKey().equals(payStatus)){
            rst = OrderQueryStatusEnum.unpay.getValue();
        }else if(SendStatusEnum.unShip.getKey().equals(sendStatus)){
            rst = OrderQueryStatusEnum.unsend.getValue();
        }else if(SendStatusEnum.ship.getKey().equals(sendStatus)){
            rst = OrderQueryStatusEnum.unreceive.getValue();
        }else if(CommentStatusEnum.unComment.getKey().equals(commentStatus)){
            rst = OrderQueryStatusEnum.uncomment.getValue();
        }
        return rst;
    }

    public String getOrderAmountStr(){
        return PriceFormatUtil.format(orderAmount);
    }

    public String getPayAmountStr(){
        return PriceFormatUtil.format(payAmount);
    }

    public String getDiscountAmountStr(){
        return PriceFormatUtil.format(discountAmount);
    }

    public String getUseCouponAmountStr(){
        return PriceFormatUtil.format(useCouponAmount);
    }

    public String getPayByBalanceStr(){
        return PriceFormatUtil.format(payByBalance);
    }

    public String getFreightAmountStr(){
        return PriceFormatUtil.format(freightAmount);
    }

    public String getOrderTypeName(){
        return OrderTypeEnum.getNameByKey(orderType);
    }

    public String getOrderStatusName(){
        return OrderStatusEnum.getNameByKey(orderStatus);
    }

    public String getPayStatusName(){
        return PayStatusEnum.getNameByKey(payStatus);
    }

    public String getPayMethodName(){
        return PayMethodEnum.getNameByKey(payMethod);
    }

    public String getPlatSourceName(){
        return PlatSourceEnum.getNameByKey(platSource);
    }

    public String getInvoiceStatusName(){
        if(ObjectUtil.isNull(invoiceUid))
            return "无需开票";
        return InvoiceStatusEnum.getNameByKey(invoiceStatus);
    }

    public String getDeliverMethodName(){
        return DeliverMethodEnum.getNameByKey(deliverMethod);
    }

    public String getSendStatusName(){
        return SendStatusEnum.getNameByKey(sendStatus);
    }
    public String getPackStatusName(){
        return PackStatusEnum.getNameByKey(orderPackStatus);
    }
    public String getCommentName(){
        return CommentStatusEnum.getNameByKey(commentStatus);
    }

    public Long storeId;

    public String storeName;

    public String storeAddress;

    public String storePhone;

    public String createName;
}
